package study.itwill.team5.board;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import study.itwill.common.DBHandler;
import study.itwill.common.DateTime;

/**
 * 게시판 - 추가, 수정, 삭제, 조회, 리스트(검색포함) 기능을 가진 클래스
 */
public class Board {
	
	// Logger 클래스의 인스턴스를 받아온다.
	static Logger logger = Logger.getLogger(Board.class);
		
	private static final String TABLE = "board";
	
	// 데이터베이스 제어 객체에 대한 참조
	DBHandler db = null;
	
	/** 현재시간 데이터 저장을 위한 SQL구문 작성 */
	String datetime = DateTime.getInstance().getNowDateTimeString();
	
	public Board() {
		// DB객체에 대한 참조 연결
		db = DBHandler.getInstance();
	}
	
	
	/**
	 * 게시글 작성을 위한 기능
	 * @param title					- 글 제목
	 * @param content				- 글 내용
	 * @param reg_date				- 등록일시
	 * @param edit_date				- 수정일시
	 * @param board_category_seq	- 게시판 분류 일련번호
	 * @param member_seq			- 회원 일련번호
	 * @return int					- 추가된 게시글에 대한 일련번호를 리턴
	 */
	public int addBoard(String title, String content, int board_category_seq, int member_seq) {
		//-----------------------------------------
		// 메서드 시작
		//-----------------------------------------
		logger.debug("=============== method start >> addBoard");
		logger.debug("[PARAMS] title=" + title);
		logger.debug("[PARAMS] content=" + content);
		logger.debug("[PARAMS] board_category_seq=" + board_category_seq);
		logger.debug("[PARAMS] member_seq=" + member_seq);
		
		int seq = -1;
		
		// SQL 인젝션 방어
		title = title.replace("'", "\'");
		content = content.replace("'", "\'");
		
		// 트랜젝션에 대한 판단이 잘 서지 않는다면, 무조건 하면 된다.
		db.beginTrans();
		
		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO board("
	            + "title, content, reg_date, edit_date, board_category_seq, member_seq"
	            + ") VALUES ('%s', '%s', '%s', '%s', %d, %d);";
		
		boolean result = db.execSql(sql, title, content,	datetime, datetime, board_category_seq, member_seq);
		
		//-----------------------------------------
		// 결과처리
		//-----------------------------------------
		if(result) {
			db.commit();
			seq = db.getMax(TABLE, "seq", null);
			logger.debug("처리결과 >> " + seq + "번 게시글 등록 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 게시글 추가 실패");
		}
		
		logger.debug("=============== method end >> addBoard");
		
		return seq;
	}
	
	/**
	 * 게시글 작성을 위한 기능
	 * @param title					- 글 제목
	 * @param content				- 글 내용
	 * @param reg_date				- 등록일시
	 * @param edit_date				- 수정일시
	 * @param board_category_seq	- 게시판 분류 일련번호
	 * @param member_seq			- 회원 일련번호
	 * @param house_seq				- 민박 일련번호
	 * @param grade					- 민박 평점
	 * @return int					- 추가된 게시글에 대한 일련번호를 리턴
	 */
	public int addBoard(String title, String content, int board_category_seq, int member_seq, int house_seq, int grade) {
		//-----------------------------------------
		// 메서드 시작
		//-----------------------------------------
		logger.debug("=============== method start >> addBoard");
		logger.debug("[PARAMS] title=" + title);
		logger.debug("[PARAMS] content=" + content);
		logger.debug("[PARAMS] board_category_seq=" + board_category_seq);
		logger.debug("[PARAMS] member_seq=" + member_seq);
		logger.debug("[PARAMS] house_seq=" + house_seq);
		logger.debug("[PARAMS] grade=" + grade);
		
		int seq = -1;
		
		// SQL 인젝션 방어
		title = title.replace("'", "\'");
		content = content.replace("'", "\'");
		
		// 데이터 조회
		String sql = "SELECT grade FROM house WHERE seq = %d;";
		
		ResultSet rs = db.getResult(sql, house_seq);
		
		double house_grade = -1.0;
		
		if(rs != null) {
			try {
				rs.next();
				house_grade = rs.getDouble(1);
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if (house_grade == -1.0) {
			return -1;
		}
		
		// 트랜젝션에 대한 판단이 잘 서지 않는다면, 무조건 하면 된다.
		db.beginTrans();
		
		if (house_grade == 0) {
			sql = "UPDATE house SET grade = (%f + %d) WHERE seq = %d;";
			
		} else {
			sql = "UPDATE house SET grade = ((%f + %d) / 2) WHERE seq = %d;";
		}
		
		boolean result = db.execSql(sql, house_grade, grade, house_seq);
		
		// INSERT 처리를 위한 구현
		sql = "INSERT INTO board("
	            + "title, content, reg_date, edit_date, board_category_seq, member_seq, house_seq, grade"
	            + ") VALUES ('%s', '%s', '%s', '%s', %d, %d, %d, %d);";
		
		result = db.execSql(sql, title, content, datetime, datetime, board_category_seq, member_seq, house_seq, grade);
		
		// 처리 이후 평점 카운트 증가
		sql = "UPDATE house SET grade_count = (grade_count + 1) WHERE seq = %d;";
		result = db.execSql(sql, house_seq);
		
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 조회수 증가 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 조회수 증가 실패 ");
		}
		
		//-----------------------------------------
		// 결과처리
		//-----------------------------------------
		if(result) {
			db.commit();
			seq = db.getMax(TABLE, "seq", null);
			logger.debug("처리결과 >> " + seq + "번 게시글 등록 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 게시글 추가 실패");
		}
		
		logger.debug("=============== method end >> addBoard");
		
		return seq;
	}
	
	/**
	 * 게시글 수정을 위한 기능
	 * @param seq					- 게시글 일련번호
	 * @param title					- 글 제목
	 * @param content				- 글 내용
	 * @param reg_date				- 등록일시
	 * @param edit_date				- 수정일시
	 * @param board_category_seq	- 게시판 분류 일련번호
	 * @param member_seq			- 회원 일련번호
	 * @return boolean				- true - 글수정 성공 / false - 글수정 실패
	 */
	public boolean editBoard(int seq, String title, String content, int board_category_seq, int member_seq) {
		logger.debug("=============== method start >> editBoard");
		logger.debug("[PARAMS] seq=" + seq);
		logger.debug("[PARAMS] title=" + title);
		logger.debug("[PARAMS] content=" + content);
		logger.debug("[PARAMS] board_category_seq=" + board_category_seq);
		logger.debug("[PARAMS] member_seq=" + member_seq);
		
		// SQL 인젝션 방어
		title = title.replace("'", "\'");
		content = content.replace("'", "\'");
		
		boolean result = false;
		
		db.beginTrans();
		
		String sql = "UPDATE board "
				+ "SET title = '%s', content = '%s', edit_date = '%s', board_category_seq = %d, member_seq = %d "
				+ "WHERE seq = %d;";
		
		result = db.execSql(sql, title, content, datetime, board_category_seq, member_seq, seq);
		
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 게시글 수정성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 데이터 수정 실패 ");
		}
		
		logger.debug("=============== method end >> editBoard");
		
		return result;
	}
	
	/**
	 * 게시글 수정을 위한 기능
	 * @param seq					- 게시글 일련번호
	 * @param title					- 글 제목
	 * @param content				- 글 내용
	 * @param reg_date				- 등록일시
	 * @param edit_date				- 수정일시
	 * @param board_category_seq	- 게시판 분류 일련번호
	 * @param member_seq			- 회원 일련번호
	 * @param house_seq				- 민박 일련번호
	 * @param grade					- 민박 평점
	 * @return boolean				- true - 글수정 성공 / false - 글수정 실패
	 */
	public boolean editBoard(int seq, String title, String content, int board_category_seq, int member_seq, int house_seq, int grade) {
		logger.debug("=============== method start >> editBoard");
		logger.debug("[PARAMS] seq=" + seq);
		logger.debug("[PARAMS] title=" + title);
		logger.debug("[PARAMS] content=" + content);
		logger.debug("[PARAMS] board_category_seq=" + board_category_seq);
		logger.debug("[PARAMS] member_seq=" + member_seq);
		logger.debug("[PARAMS] house_seq=" + house_seq);
		logger.debug("[PARAMS] grade=" + grade);
		
		
		// SQL 인젝션 방어
		title = title.replace("'", "\'");
		content = content.replace("'", "\'");
		
		boolean result = false;
		
		// 데이터 조회
		String sql = "SELECT house_seq, grade FROM board WHERE seq = %d;";
		
		ResultSet rs = db.getResult(sql, seq);
		
		int house_seq_data = -1, grade_data = -1;
		
		if(rs != null) {
			try {
				rs.next();
				house_seq_data = rs.getInt(1);
				grade_data = rs.getInt(2);
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		db.beginTrans();
		
		if (house_seq_data > 0 && grade_data > 0) {
			// 데이터 조회
			sql = "SELECT grade FROM house WHERE seq = %d;";
			
			rs = db.getResult(sql, house_seq_data);
			
			double house_grade = -1.0;
			
			if(rs != null) {
				try {
					rs.next();
					house_grade = rs.getDouble(1);
				} catch (SQLException e) {
					logger.error(e);
				} finally {
					try {
						rs.close();
					} catch (SQLException e) {}
					rs = null;
				}
			}
			
			if (house_grade < 0) {
				db.rollback();
				return false;
			} else {
				sql = "UPDATE house SET grade = ((%f * 2) - %d) WHERE seq = %d;";
				result = db.execSql(sql, house_grade, grade_data, house_seq_data);
			}
			
		}
		
		sql = "DELETE FROM comment WHERE board_seq = %d;";
		result = db.execSql(sql, seq);
		
		// 데이터 조회
		sql = "SELECT grade FROM house WHERE seq = %d;";
		
		rs = db.getResult(sql, house_seq);
		
		double house_grade = -1.0;
		
		if(rs != null) {
			try {
				rs.next();
				house_grade = rs.getDouble(1);
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if (house_grade == -1.0) {
			db.rollback();
			return false;
		}
		
		if (house_grade == 0) {
			sql = "UPDATE house SET grade = (%f + %d) WHERE seq = %d;";
			
		} else {
			sql = "UPDATE house SET grade = ((%f + %d) / 2) WHERE seq = %d;";
		}
		
		result = db.execSql(sql, house_grade, grade, house_seq);
		
		sql = "UPDATE board "
				+ "SET title = '%s', content = '%s', edit_date = '%s', board_category_seq = %d, member_seq = %d, house_seq = %d, grade = %d "
				+ "WHERE seq = %d;";
		
		result = db.execSql(sql, title, content, datetime, board_category_seq, member_seq, house_seq, grade, seq);
		
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 게시글 수정성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 데이터 수정 실패 ");
		}
		
		logger.debug("=============== method end >> editBoard");
		
		return result;
	}
	
	/**
	 * 게시글 삭제를 위한 기능
	 * @param seq			- 게시글 일련번호
	 * @return boolean		- true - 글삭제 성공 / false - 글삭제 실패
	 */
	public boolean deleteBoard(int seq) {
		logger.debug("=============== method start >> deleteBoard");
		logger.debug("[PARAMS] seq=" + seq);
		
		boolean result = false;
		
		db.beginTrans();
		
		String sql = "DELETE FROM comment WHERE board_seq = %d;";
		result = db.execSql(sql, seq);
		sql = "DELETE FROM board WHERE seq = %d;";
		result = db.execSql(sql, seq);
		
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 게시글 삭제 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 데이터 삭제 실패 ");
		}
		
		logger.debug("=============== method end >> deleteBoard");
		
		return result;
	}
	
	/**
	 * 게시글 삭제를 위한 기능
	 * @param seq			- 게시글 일련번호
	 * @param house_seq		- 민박 일련번호
	 * @param grade			- 민박 평점
	 * @return boolean		- true - 글삭제 성공 / false - 글삭제 실패
	 */
	public boolean deleteBoard(int seq, int house_seq, int grade) {
		logger.debug("=============== method start >> deleteBoard");
		logger.debug("[PARAMS] seq=" + seq);
		logger.debug("[PARAMS] member_seq=" + house_seq);
		logger.debug("[PARAMS] house_seq=" + grade);
		
		boolean result = false;
		
		db.beginTrans();
		
		// 데이터 조회
		String sql = "SELECT grade, grade_count FROM house WHERE seq = %d;";
		
		ResultSet rs = db.getResult(sql, house_seq);
		
		double house_grade = -1.0;
		int grade_count = -1;
		if(rs != null) {
			try {
				rs.next();
				house_grade = rs.getDouble(1);
				grade_count = rs.getInt(2);
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if (house_grade < 0 || grade_count < 0) {
			db.rollback();
			return false;
		} else {
			if (grade_count == 1) {
				sql = "UPDATE house SET grade = (%f - %d) WHERE seq = %d;";
			} else if (grade_count > 1) {
				sql = "UPDATE house SET grade = ((%f * 2) - %d) WHERE seq = %d;";
			}
			result = db.execSql(sql, house_grade, grade, house_seq);
			sql = "UPDATE house SET grade_count = %d WHERE seq = %d;";
			result = db.execSql(sql, grade_count - 1, house_seq);
		}
		
		sql = "DELETE FROM comment WHERE board_seq = %d;";
		result = db.execSql(sql, seq);
		sql = "DELETE FROM board WHERE seq = %d;";
		result = db.execSql(sql, seq);
		
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 게시글 삭제 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 데이터 삭제 실패 ");
		}
		
		logger.debug("=============== method end >> deleteBoard");
		
		return result;
	}
	
	/**
	 * 게시글 조회를 위한 기능
	 * @param seq			- 게시글 일련번호
	 * @return BoardItem	- 게시글 한개의 정보를 객체로 리턴
	 */
	public BoardItem viewBoard(int seq) {
		logger.debug("=============== method start >> viewBoard");
		logger.debug("[PARAMS] seq=" + seq);
		
		BoardItem item = null;
		
		// 조회수 카운트
		String hit_sql = "UPDATE board SET hit = (hit + 1) WHERE seq = %d;";
		boolean result = db.execSql(hit_sql, seq);
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 조회수 증가 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 조회수 증가 실패 ");
		}
		
		// 데이터 조회
		String sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
				+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
				+ "INNER JOIN member ON member_seq = member.seq "
				+ "WHERE board.seq = %d;";
		
		ResultSet rs = db.getResult(sql, seq);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();
				
				// 1) ResultSet의 모든 데이터를 변수로 추출
				int board_seq = rs.getInt(1);
				String title = rs.getString(2);
				String content = rs.getString(3);
				int hit = rs.getInt(4);
				String reg_date = rs.getString(5);
				String edit_date = rs.getString(6);
				int board_category_seq = rs.getInt(7);
				String category_name = rs.getString(8);
				int member_seq = rs.getInt(9);
				String user_name = rs.getString(10);
				int house_seq = rs.getInt(11);
				int grade = rs.getInt(12);
				
				// 2) 추출된 값을 객체로 구성
				item = new BoardItem(board_seq, title, content, hit, reg_date, edit_date, board_category_seq, 
						category_name, member_seq, user_name, house_seq, grade);
				
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}
				
		logger.debug("=============== method end >> viewBoard");
		
		return item;
	}
	
	/**
	 * 게시글 리스트 조회를 위한 기능
	 * @param choice				- 검색조건 (0:게시글전체, 1:카테고리, 2:민박번호, 3:제목, 4:내용, 5:회원)
	 * @param search				- 검색어
	 * @return ArrayList<BoardItem>	- 게시글 리스트 정보를 객체배열로 리턴
	 */
	public ArrayList<BoardItem> listBoard(int choice, String search) {
		logger.debug("=============== method start >> listBoard");
		logger.debug("[PARAMS] choice=" + choice);
		logger.debug("[PARAMS] search=" + search);
		
		ArrayList<BoardItem> list = null;
		
		String sql = null;
		
		/*
		 *  게시글 검색을 위한 파라미터 정의
		 *  0, null : 게시글 전체리스트 검색
		 *  		(전체리스트 검색은 오버로딩 정의로 숫자값 하나만을 파라미터로 받을수 있다)
		 *  1, 게시판 카테고리 일련번호 검색
		 *  2, "제목 검색"
		 *  3, "내용 검색"
		 *  4, "회원 검색"
		 */
		switch(choice) {
		case 0:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq;";
			break;
		
		case 1:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE board_category_seq = " + search + " "
					+ "ORDER BY board.seq DESC;";
			break;
			
		case 2:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE board.house_seq = " + search + " "
					+ "ORDER BY board.seq DESC;";
			break;
			
		case 3:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE title like '%%" + search + "%%';";
			break;
		
		case 4:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE content like '%%" + search + "%%';";
			break;
			
		case 5:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE user_name like '%%" + search + "%%';";
			break;
			
		default:
			System.out.println("검색조건 선택이 올바르지 않습니다.");
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE board.seq=-1;";
			break;
		}
			
		ResultSet rs = db.getResult(sql);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<BoardItem>();
				
				while(rs.next()) {
					
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int board_seq = rs.getInt(1);
					String title = rs.getString(2);
					String content = rs.getString(3);
					int hit = rs.getInt(4);
					String reg_date = rs.getString(5);
					String edit_date = rs.getString(6);
					int board_category_seq = rs.getInt(7);
					String category_name = rs.getString(8);
					int member_seq = rs.getInt(9);
					String user_name = rs.getString(10);
					int house_seq = rs.getInt(11);
					int grade = rs.getInt(12);
					
					// 2) 추출된 값을 객체로 구성
					BoardItem item = new BoardItem(board_seq, title, content, hit, reg_date, edit_date, 
							board_category_seq, category_name, member_seq, user_name, house_seq, grade);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("=============== method end >> listBoard");
		
		return list;
	}
	
	/**
	 * 게시글 리스트 조회를 위한 기능
	 * @param choice				- 검색조건 (0:게시글전체, 1:카테고리, 2:민박번호, 3:제목, 4:내용, 5:회원)
	 * @param search				- 검색어
	 * @param start					- 검색 범위의 시작위치
	 * @param end					- 한 페이지에 보여질 글의 목록 수
	 * @return ArrayList<BoardItem>	- 게시글 리스트 정보를 객체배열로 리턴
	 */
	public ArrayList<BoardItem> listBoard(int choice, String search, int start, int end) {
		logger.debug("=============== method start >> listBoard");
		logger.debug("[PARAMS] choice=" + choice);
		logger.debug("[PARAMS] search=" + search);
		logger.debug("[PARAMS] start=" + start);
		logger.debug("[PARAMS] end=" + end);
		
		ArrayList<BoardItem> list = null;
		
		String sql = null;
		
		/*
		 *  게시글 검색을 위한 파라미터 정의
		 *  0, null : 게시글 전체리스트 검색
		 *  		(전체리스트 검색은 오버로딩 정의로 숫자값 하나만을 파라미터로 받을수 있다)
		 *  1, 게시판 카테고리 일련번호 검색
		 *  2, "제목 검색"
		 *  3, "내용 검색"
		 *  4, "회원 검색"
		 */
		switch(choice) {
		case 0:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq LIMIT %d, %d;";
			break;
		
		case 1:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE board_category_seq = " + search + " "
					+ "ORDER BY board.seq DESC LIMIT %d, %d;";
			break;
			
		case 2:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE board.house_seq = " + search + " "
					+ "ORDER BY board.seq DESC LIMIT %d, %d;";
			break;
			
		case 3:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE title like '%%" + search + "%%' LIMIT %d, %d;";
			break;
		
		case 4:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE content like '%%" + search + "%%' LIMIT %d, %d;";
			break;
			
		case 5:
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE user_name like '%%" + search + "%%' LIMIT %d, %d;";
			break;
			
		default:
			System.out.println("검색조건 선택이 올바르지 않습니다.");
			sql = "SELECT board.seq, title, content, hit, board.reg_date, board.edit_date, board_category_seq, board_category.category_name, member_seq, user_name, house_seq, board.grade "
					+ "FROM board INNER JOIN board_category ON board_category_seq = board_category.seq "
					+ "INNER JOIN member ON member_seq = member.seq "
					+ "WHERE board.seq=-1 LIMIT %d, %d;";
			break;
		}
			
		ResultSet rs = db.getResult(sql, start, end);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<BoardItem>();
				
				while(rs.next()) {
					
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int board_seq = rs.getInt(1);
					String title = rs.getString(2);
					String content = rs.getString(3);
					int hit = rs.getInt(4);
					String reg_date = rs.getString(5);
					String edit_date = rs.getString(6);
					int board_category_seq = rs.getInt(7);
					String category_name = rs.getString(8);
					int member_seq = rs.getInt(9);
					String user_name = rs.getString(10);
					int house_seq = rs.getInt(11);
					int grade = rs.getInt(12);
					
					// 2) 추출된 값을 객체로 구성
					BoardItem item = new BoardItem(board_seq, title, content, hit, reg_date, edit_date, 
							board_category_seq, category_name, member_seq, user_name, house_seq, grade);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("=============== method end >> listBoard");
		
		return list;
	}
	
	/**
	 * 게시글 전체리스트 검색을 위한 오버로딩 정의
	 * @param choice					- 0으로 파라미터를 받을시 전체리스트 조회
	 * @return ArrayList<BoardItem>		- 0과 null을 오버로딩된 메서드로 반환
	 */
	public ArrayList<BoardItem> listBoard(int choice) {
		return listBoard(choice, null);
	}
}
